package com.cql.service.business.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.cql.common.constant.FoodCircleConstant;
import com.cql.common.core.DO.MomentDO;
import com.cql.common.core.DO.UserRelationDO;
import com.cql.common.utils.StringUtils;
import com.cql.mapper.SysUserRoleMapper;
import com.cql.mapper.UserRelationMapper;
import com.cql.service.business.AuthService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author cql
 */
@Service
public class AuthServiceImpl implements AuthService {

    @Autowired
    private UserRelationMapper userRelationMapper;

    final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Override
    public boolean authMoment(MomentDO moment, Long userId) {
        if (StringUtils.isNull(moment)) {
            return false;
        }
        /**
         * 数据权限:
         * （1）如果用户将数据设置仅个人可见,那么需要判断当前访问是否是本人，如果不是本人或游客，即无权限
         * （2）如果用户将数据设置仅粉丝可见，需要判断当前用户是否是文章主人的粉丝
         * （3）如果用户设置所有人可见，则放行
         * （4）如果文章处于正在审核阶段，谁也不可查看和修改,删除（包括文章主人）
         * （5）如果文章处于草稿阶段,即允许文章主人查看
         */

        //如果文章处于正在审核阶段，谁也不可查看和修改（包括文章主人）
        if (FoodCircleConstant.VERIFYING_STATUS.equals(moment.getStatus())) {
            logger.info("文章正在审核中，任何人不可查看");
            return false;
        }

        //如果文章处于草稿阶段,即允许文章主人查看
        if (FoodCircleConstant.DRAFT_STATUS.equals(moment.getStatus())) {
            if (StringUtils.isNull(userId)) {
                logger.info("文章处于草稿阶段，即允许文章主人查看");
                return false;
            } else {
                if (moment.getUserId().equals(userId)) {
                    return true;
                } else {
                    logger.info("文章处于草稿阶段，即允许文章主人查看");
                    return false;
                }
            }
        }

        //如果用户设置所有人可见，则放行
        if (FoodCircleConstant.ALL_FRIEND.equals(moment.getDataScope())) {
            return true;
        }

        //如果用户将数据设置仅粉丝可见，需要判断当前用户是否是文章主人的粉丝
        if (FoodCircleConstant.ONLY_FAN.equals(moment.getDataScope())) {
            if (StringUtils.isNull(userId)) {
                return false;
            }
            QueryWrapper<UserRelationDO> wrapper = new QueryWrapper<>();
            wrapper.eq("from_user", userId);
            wrapper.eq("to_user", moment.getUserId());
            UserRelationDO relation = userRelationMapper.selectOne(wrapper);
            if (StringUtils.isNull(relation)) {
                return false;
            } else {
                return true;
            }
        }

        //如果用户将数据设置仅个人可见,那么需要判断当前访问是否是本人，如果不是本人或游客，即无权限
        if (FoodCircleConstant.ONLY_ME.equals(moment.getDataScope())) {
            if (StringUtils.isNull(userId)) {
                return false;
            }
            if (userId.equals(moment.getUserId())) {
                return true;
            } else {
                return false;
            }
        }

        return false;
    }
}
